package arrayOps

import C "gitee.com/ljfirst/algo-go-sdk/common/constant"

/**
 * @author ljfirst
 * @version V1.0
 * @date 2023/7/15 14:31
 * @author-Email ljfirst@mail.ustc.edu.cn
 * @blogURL https://blog.csdn.net/ljfirst
 * @description
 * 假设要找的数字是num，如果跟下一个array[i]不一致，则count--，即对对消除
 **/
type OverHalfNum struct {
}

func (m *OverHalfNum) Method(array []int) int {
	if len(array) == 0 {
		return C.ErrorNum
	}
	if len(array) == 1 {
		return array[0]
	}
	count := 0
	num := C.ErrorNum
	for _, v := range array {
		if count == 0 {
			num = v
			count++
		}
		if num == v {
			count++
		} else {
			count--
		}
	}
	return num
}

func (m *OverHalfNum) GetAttribute() *C.Attribute {
	return &C.Attribute{
		Tags: []string{C.PigeonCage},
		Desc: &C.Desc{
			Name:        "OverHalfNum",
			NameCn:      "超过半数的数",
			Description: "数组中有一个数字出现的次数超过数组长度的一半，请找出这个数字",
			Example: map[int]string{
				1: "输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半，因此输出2。如果不存在则输出 -9999",
			},
		},
	}
}
